import argparse
import psutil
import win32process
import win32gui
import win32api
import win32con
import time
import json
from typing import List
from WindowInfo import WindowInfo

def get_all_windows(exe_name, show_invisible=False):
    """
    获取某程序下所有的窗口
    show_invisible=True 包括不可见窗口（最小化到托盘的那种窗口）
    """
    result = []

    # 获取所有 WeChatAppEx.exe 的 PID
    target_pids = [
        p.pid for p in psutil.process_iter(["pid", "name"])
        if p.info["name"] == exe_name
    ]

    # 枚举系统中所有窗口
    def callback(hwnd, _):
        try:
            if show_invisible is False and not win32gui.IsWindowVisible(hwnd):
                return
            _, pid = win32process.GetWindowThreadProcessId(hwnd)
            if pid in target_pids:
                title = win32gui.GetWindowText(hwnd)
                class_name = win32gui.GetClassName(hwnd)
                result.append(WindowInfo(hwnd).to_dict())
        except Exception as e:
            pass

    win32gui.EnumWindows(callback, None)

    return result


def main():
    # 创建命令行参数解析器
    parser = argparse.ArgumentParser(description='获取指定进程的窗口信息')
    
    # 添加必需的exe_name参数
    parser.add_argument('exe_name', type=str, help='进程名称，例如: WeChat.exe, WeChatAppEx.exe')
    
    # 添加可选的show_invisible参数，默认为False
    parser.add_argument('--show_invisible', action='store_true', 
                        help='是否显示不可见窗口（包括最小化到托盘的那种窗口），默认只显示可见窗口')
    
    # 添加可选的sleep参数，默认为0
    parser.add_argument('--sleep', type=int, default=0, 
                        help='执行前等待的秒数，默认不等待')
    
    # 解析命令行参数
    args = parser.parse_args()
    
    # 等待指定的秒数
    if args.sleep > 0:
        print(f"等待 {args.sleep} 秒后执行...")
        time.sleep(args.sleep)
    
    # 获取窗口信息
    windows = get_all_windows(args.exe_name, args.show_invisible)
    
    # 打印结果
    print(json.dumps(windows, indent=4, ensure_ascii=False))

if __name__ == "__main__":
    """
    编译可执行文件
    uv pip install pyinstaller

    pyinstaller --clean --onefile --name EnumWindows EnumWindows.py
    """
    main()
